package fr.paug.androidmakers.ui.activity;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.robertlevonyan.views.chip.OnChipClickListener;
import java.util.Formatter;
import fr.paug.androidmakers.BuildConfig;
import fr.paug.androidmakers.R;
import fr.paug.androidmakers.databinding.ActivityDetailBinding;
import fr.paug.androidmakers.databinding.DetailViewSpeakerInfoElementBinding;
import fr.paug.androidmakers.databinding.SmallSocialImageBinding;
import fr.paug.androidmakers.manager.AgendaRepository;
import fr.paug.androidmakers.model.Room;
import fr.paug.androidmakers.model.Session;
import fr.paug.androidmakers.model.SocialNetworkHandle;
import fr.paug.androidmakers.model.Speaker;
import fr.paug.androidmakers.service.SessionAlarmService;
import fr.paug.androidmakers.ui.view.AgendaView;
import fr.paug.androidmakers.util.SessionSelector;
public class DetailActivity extends BaseActivity {
private static final String PARAM_SESSION_ID = "param_session_id";
private static final String PARAM_SESSION_START_DATE = "param_session_start_date";
private static final String PARAM_SESSION_END_DATE = "param_session_end_date";
private static final String PARAM_SESSION_ROOM = "param_session_room";
private int sessionId;
private long sessionStartDateInMillis;
private long sessionEndDateInMillis;
public static void startActivity(Context context, AgendaView.Item item) {
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra(PARAM_SESSION_ID, item.getSessionId());
intent.putExtra(PARAM_SESSION_START_DATE, item.getStartTimestamp());
intent.putExtra(PARAM_SESSION_END_DATE, item.getEndTimestamp());
intent.putExtra(PARAM_SESSION_ROOM, item.getRoomId());
context.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActivityDetailBinding activityDetailBinding = DataBindingUtil.setContentView(this, R.layout.activity_detail);
sessionId = getIntent().getIntExtra(PARAM_SESSION_ID, -1);
final Session session = AgendaRepository.getInstance().getSession(sessionId);
sessionStartDateInMillis = getIntent().getLongExtra(PARAM_SESSION_START_DATE, -1);
sessionEndDateInMillis = getIntent().getLongExtra(PARAM_SESSION_END_DATE, -1);
final Room sessionRoom = AgendaRepository.getInstance().getRoom(
getIntent().getIntExtra(PARAM_SESSION_ROOM, -1)
);
if (session == null) {
// We have a problem !
activityDetailBinding.sessionInformations.setVisibility(View.GONE);
activityDetailBinding.errorMessage.setVisibility(View.VISIBLE);
return;
}
final String sessionDate = DateUtils.formatDateRange(this, new Formatter(getResources().getConfiguration().locale), sessionStartDateInMillis, sessionEndDateInMillis, DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_WEEKDAY | DateUtils.FORMAT_SHOW_TIME, null).toString();
final String sessionDateAndRoom = sessionRoom != null && !TextUtils.isEmpty(sessionRoom.name) ? getString(R.string.sessionDateWithRoomPlaceholder, sessionDate, sessionRoom.name) : sessionDate;
activityDetailBinding.sessionTitle.setText(session.title);
activityDetailBinding.sessionDateAndRoom.setText(sessionDateAndRoom);
activityDetailBinding.sessionDescription.setMovementMethod(LinkMovementMethod.getInstance());
activityDetailBinding.sessionDescription.setText(session.description != null ?
Html.fromHtml(session.description) : "");
final int languageFullNameRes = session.getLanguageName();
if (languageFullNameRes != 0) {
activityDetailBinding.sessionLanguage.setChipText(getString(languageFullNameRes));
activityDetailBinding.sessionLanguage.setOnChipClickListener(new OnChipClickListener() {
@Override
public void onChipClick(View view) {
if (BuildConfig.DEBUG) {
Log.d(DetailActivity.class.getName(), "User clicked on tag with content=" + session.language);
}
}
});
} else {
activityDetailBinding.sessionLanguage.setVisibility(View.GONE);
}
activityDetailBinding.sessionType.setChipText(session.subtype);
activityDetailBinding.sessionType.setOnChipClickListener(new OnChipClickListener() {
@Override
public void onChipClick(View view) {
if (BuildConfig.DEBUG) {
Log.d(DetailActivity.class.getName(), "User clicked on tag with content=" + session.subtype);
}
// TODO: Use this for future filter feature
}
});
final ViewGroup sessionSpeakerLayout = (ViewGroup) findViewById(R.id.sessionSpeakerLayout);
if (session.speakers != null && session.speakers.length > 0) {
activityDetailBinding.speakersTitle.setText(getResources().getQuantityString(R.plurals.session_details_speakers, session.speakers.length));
for (final int speakerID : session.speakers) {
final Speaker speaker = AgendaRepository.getInstance().getSpeaker(speakerID);
if (speaker == null) {
continue;
}
final DetailViewSpeakerInfoElementBinding speakerInfoElementBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.detail_view_speaker_info_element, null, false);
speakerInfoElementBinding.speakerBio.setMovementMethod(LinkMovementMethod.getInstance());
speakerInfoElementBinding.setSpeaker(speaker);
if (speaker.socialNetworkHandles != null && speaker.socialNetworkHandles.size() > 0) {
for (final SocialNetworkHandle socialNetworkHandle : speaker.socialNetworkHandles) {
if (socialNetworkHandle.networkType != SocialNetworkHandle.SocialNetworkType.Unknown) {
final SmallSocialImageBinding smallSocialImageBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.small_social_image, null, false);
smallSocialImageBinding.image.setImageResource(socialNetworkHandle.networkType.getSocialNetworkIcon());
smallSocialImageBinding.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (BuildConfig.DEBUG) {
Log.d(DetailActivity.class.getName(), "User clicked on social handle with name=" + socialNetworkHandle.networkType.name());
}
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(socialNetworkHandle.link)));
}
});
speakerInfoElementBinding.speakerSocialNetworkHandleLayout.addView(smallSocialImageBinding.getRoot());
}
}
} else {
speakerInfoElementBinding.speakerSocialNetworkHandleLayout.setVisibility(View.GONE);
}
sessionSpeakerLayout.addView(speakerInfoElementBinding.getRoot());
}
}
setActionBar(session);
}
private void setActionBar(Session session) {
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(session.title);
}
}
private void changeSessionSelection(boolean select) {
SessionSelector.getInstance().setSessionSelected(sessionId, select);
invalidateOptionsMenu();
if(select) {
Toast.makeText(this, R.string.session_selected, Toast.LENGTH_SHORT).show();
scheduleStarredSession();
} else {
Toast.makeText(this, R.string.session_deselected, Toast.LENGTH_SHORT).show();
unscheduleSession();
}
}
private void scheduleStarredSession() {
Log.d("Detail", "Scheduling notification about session start. " +
"start time : " + sessionStartDateInMillis + ", " +
"end time : " + sessionEndDateInMillis);
final Intent scheduleIntent = new Intent(
SessionAlarmService.ACTION_SCHEDULE_STARRED_BLOCK,
null, this, SessionAlarmService.class);
scheduleIntent.putExtra(SessionAlarmService.EXTRA_SESSION_START, sessionStartDateInMillis);
scheduleIntent.putExtra(SessionAlarmService.EXTRA_SESSION_END, sessionEndDateInMillis);
scheduleIntent.putExtra(SessionAlarmService.EXTRA_SESSION_ID, sessionId);
startService(scheduleIntent);
}
private void unscheduleSession() {
Log.d("Detail", "Unscheduling notification about session start. " +
"start time : " + sessionStartDateInMillis + ", " +
"end time : " + sessionEndDateInMillis);
final Intent scheduleIntent = new Intent(
SessionAlarmService.ACTION_UNSCHEDULE_UNSTARRED_BLOCK,
null, this, SessionAlarmService.class);
scheduleIntent.putExtra(SessionAlarmService.EXTRA_SESSION_ID, sessionId);
startService(scheduleIntent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.star, menu);
final MenuItem selectItem = menu.findItem(R.id.select);
final MenuItem unselectItem = menu.findItem(R.id.unselect);
if (selectItem != null && unselectItem != null) {
if (SessionSelector.getInstance().isSelected(sessionId)) {
selectItem.setVisible(false);
unselectItem.setVisible(true);
} else {
unselectItem.setVisible(false);
selectItem.setVisible(true);
}
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
case R.id.select:
changeSessionSelection(true);
return true;
case R.id.unselect:
changeSessionSelection(false);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}